687. 最长同值路径

687. 最长同值路径

Similar Question

124. 二叉树中的最大路径和 - 力扣(LeetCode)

Solution Tips

方案一: 模拟 + 递归


var longestUnivaluePath = function(node) {
    // 看起来就是普通的遍历一下, 然后记录最长的相同值的 node 就可以了
    // 先后序遍历均可

    // 不行, 不是单纯的先后序遍历可以处理的, 想象一下从最左侧的节点到最右侧节点的最长路径
    // 经典的左和右? 左侧的最长 + 右侧的最长, 还是不行, 会漏掉 path
    // 想要遍历一个二叉树所有的边, 必须通过一次先序+后序

    // 遍历所有的边, 按理说是和遍历所有的节点相同的, 所以没必要模拟题意
    // 就看单个节点, 左节点和右节点是否与自己相同, 如果相同就标记 +1, 再递归
    let max = 0;
    recursion(node);
    return max;

    function recursion(node) {
        if (node === null) return 0;

        let leftLen = 0;
        let rightLen = 0;
        if (node.left) {
            if (node.val === node.left.val) {
                leftLen += recursion(node.left) + 1;
            }
            else {
                recursion(node.left);
            }
        }

        if (node.right) {
            if (node.val === node.right.val) {
                rightLen += recursion(node.right) + 1;
            }
            else {
                recursion(node.right);
            }
        }

        // 自己视角的路径是 左 + 右 + 自己
        max = Math.max(max, leftLen + rightLen);
        // 但是能向上传递的就只能是左右里最长的那一条
        return Math.max(leftLen, rightLen);
    }

};

console.log(longestUnivaluePath(t.root))